/* Autoren : Dominik Becker
Klasse : FI1.1
Dateiname : login.c
Datum : 09.05.2011
Beschreibung: Das Programm ist f\201r die Registrierung und den Login von Benutzern zust\204ndig.
Version : 1.0

Programmschnittstelle:
int LogReg(int position, int spiel);
1. Parameter: int wert 0 oder 1 (0 vor dem Men\201 und 1 vor dem Spiel)
2. Parameter: int wert, zu startendes spiel
*/


#include "header.h"

#define true 1
#define false 0
#define _CRT_SECURE_NO_DEPRICATE 1

int logReg(int position, int spiel)
/* Logt einen Benutzer ein und beitet die m\224glichkeit sich zu Registrieren. Die globale Variable benutzername bzw benutzernameZwei wird gesetzt.
1. Parameter: int wert 0 oder 1 (0 vor dem Men\201 und 1 vor dem Spiel)
2. Parameter: int wert, zu startendes spiel
3. R\201ckgabewert: int 0;
*/
{
                int iAuswahl;
        int iLogin;
        char acTemppass[21] = "passwort";
        while(true)
                {
            system("cls");
                        (position==0)?printf("\n Bitte waehlen Sie aus:\n1 - Einloggen\n2 - Registrieren\n3 - Beenden\n"):printf("\nEs wird ein zweiter Spieler ben\224tigt.\nBitte waehlen Sie aus:\n1 - Einloggen\n2 - Registrieren\n3 - zur\201ck zum Men\201\n");
            
                        fflush(stdin);
                        scanf("%i", &iAuswahl);
                        
            switch(iAuswahl){
                    case 1:
                                                        system("cls");
                                                        iLogin = login(position);
                                                        if(iLogin)
                                                        {
                                                                switch(position)
                                                                {
                                                                        case 0:
                                                                                getMainMenue(); //aufruf des Haupmen\201s
                                                                                break;
                                                                        case 1: 
                                                                                switch(spiel)
                                                                                {
                                                                                        case 1:
                                                                                                reversi(0);
																								//BerechneNeueBewertung();
                                                                                                break;
                                                                                        case 2:
                                                                                                //checkers
																								checkers();
                                                                                                break;
                                                                                        case 3: 
                                                                                                //Vier gewinnt
                                                                                                fourInARow(0);
                                                                                                return 1;
                                                                                                break;
                                                                                        case 4:
																								//bridges
                                                                                                bridges();
                                                                                                break;
                                                                                }
																				return 0;
                                                                                break;
                                                                }
                                                        }
                                                        break;
                    case 2:
                            registrate();//neuen Benutzer anlegen
                            break;
                    case 3:
                            return 0;
                            break;
                    default:
                                                        system("cls");
                            printf("\nUng\201ltige Eingabe!\n");
                            system("pause");
                            break;
            }
        }
    return 0;
}


int choosePassword(char* strOut, unsigned int strSize,int iText)
/* Bietet die m\224glichkeit ein Passwort einzugeben, dieses wird auf falsche Zeichen etc. gepr\201ft.
1. Parameter : Zeiger auf Variable in der das Passwort gespeichert werden soll.
2. Parameter : L\204nge des Strings.
3. Parameter : int Nummer des anzuzeigenden Textes.
4. R\201ckgabewert: int true/false (erfolgt/nicht erfolgt)
*/
{
        char acTemppass[21];
        char ch;
        int i = 0;
        int n = 0;
        char acText[200];

        switch(iText)
        {
                case 0:
                    strcpy(acText, "\nBitte geben Sie das gew\201nschte Passwort ein.\n(Min. 2, Max. 20 Zeichen, nur Buchstaben und Zahlen)\n");
                    break;
                case 1:
                    strcpy(acText, "\nBitte wiederholen Sie das Passwort:\n");
                    break;
                case 2:
                    strcpy(acText, "\nGeben Sie Ihr Passwort ein:\n");
                    break;
        }
       
        system("cls");
        printf("%s", acText);
                
                //Es werden h\224chstens 20 Zeichen angenommen.Alle eingaben ausser Zahlen und Buchstaben werden ignoriert.
        while( i < 20)
        {
                        acTemppass[i] = 0;
                        ch = getch();
                        // Wurde ein Punkt eingegeben, so wird die Eingabe abgebrochen.
                        if( ch == 46)
                        {
                                return 0;
                        }
                        //Bei der eingabe von Return wird die Eingabe abgeschlossen.
                        if(ch == 13 && i > 1)
                        {
                                break;
                        }
                        // Bei eingabe von Backspace wird das letzte Zeichen gel\224scht.
                        if(ch == 8 && i > 0)
                        {
                                i--;
                                acTemppass[i]=0;
                                system("cls");
                                printf("%s", acText);
                                while(acTemppass[n] != 0)
                                {
                                                printf("*");
                                                n++;
                                }
                                n = 0;
                                continue;
                        }
                        if(isalpha(ch) || isdigit(ch))
                        {
                                acTemppass[i] = ch;
                                i++;
                        }
                        else
                        {
                                continue;
                        }

                        if(i>0)
                        {
                                        printf("*");
                        }
        }      
        strncpy( strOut, acTemppass, strSize );
                return 1;
}

int chooseUsername(char* strOut, unsigned int strSize, int iText)
/* Bietet die m\224glichkeit einen Benutzernamen einzugeben, dieser wird auf falsche Zeichen etc. gepr\201ft.
1. Parameter : Zeiger auf Variable in der der Benutzername gespeichert werden soll.
2. Parameter : L\204nge des Strings.
3. Parameter : int Nummer des anzuzeigenden Textes.
4. R\201ckgabewert: int true/false (erfolgt/nicht erfolgt)
*/
{
    char acTempuser[21];
    char ch;
    char acText[200];
    int i = 0;

    switch(iText)
        {
                case 0:
                        strcpy(acText,"\nBitte geben Sie den gew\201nschten Benutzernamen ein.\n(Min. 2, Max. 20 Zeichen, nur Buchstaben und Zahlen)\nOder tippen Sie '.' (Punkt) um zur\201ck zu gelangen\n");
                        break;
                case 1:
                        strcpy(acText, "\nGeben Sie Ihren Benutzernamen ein\nOder tippen Sie '.' (Punkt) um zur\201ck zu gelangen\n");
                        break;
    }

    system("cls");        
    printf("%s", acText);
    
        //Es werden h\224chstens 20 Zeichen angenommen.Alle eingaben ausser Zahlen und Buchstaben werden ignoriert.
    while( i < 20)
    {
            acTempuser[i] = 0;
            ch = getch();
                        // Wurde ein Punkt eingegeben, so wird die Eingabe abgebrochen.
                        if( ch == 46)
                        {
                                return 0;
                        }
           //Bei der eingabe von Return wird die Eingabe abgeschlossen.
                        if(ch == 13 && i > 1)
                        {
                                break;
                        }
                        // Bei eingabe von Backspace wird das letzte Zeichen gel\224scht.
            if(ch == 8 && i > 0)
            {
                i--;
                acTempuser[i]=0;
                system("cls");
                printf("%s", acText);
                printf("%s", acTempuser);
                continue;
            }
            if(isalpha(ch) || isdigit(ch))
            {
                                acTempuser[i] = ch;
                                i++;
            } 
                        else
                        {
                continue;
            }

            if(i>0)
            {
                printf("%c", acTempuser[i-1]);
            }
    }      
    strncpy( strOut, acTempuser, strSize );
        return 1;
}

void setPassword(char* strOut, unsigned int strSize)
/* Fordert 2 mal das Passwort und gibt es bei \201bereinstimmung verschl\201sselt an die \201bergebene Variable weiter.
1. Parameter : Zeiger auf Variable in der das Passwort gespeichert werden soll.
2. Parameter : L\204nge des Strings.
4. R\201ckgabewert: kein r\201ckgabewert, allerdings wird das Passwort in die Variable des \201bergebenen Zeigers gespeichert.
*/
{
    char acTemppass[21] = "0";
    char acTemppass2[21] = "1";
    int iTry = 0;

        /* fragt solange 2 passw\224rter ab, bis diese \201bereinstimmen */
    while(strcmp(acTemppass,acTemppass2) != 0)
    {
                if(iTry != 0)
                {                      
                        printf("\n Leider stimmen die eingegebenen Passw\224rter nicht \201berein!\n Bitte versuchen Sie es erneut!\n");
                        system("pause");
                }
                choosePassword(acTemppass, 21, 0);
                choosePassword(acTemppass2, 21, 1);
                iTry++;
    }
       
    strncpy( strOut, acTemppass, strSize );
}

int registrate(void)
/* Bietet die M\224glichkeit einen neuen Benutzer zu Registrieren.

R\201ckgabewert: int true/false (erfolgt/nicht erfolgt)
*/
{
    char input = 0;
    char acTempuser[21];
    char acTemppass[21];
        if(!chooseUsername(acTempuser, 21, 0))
        {
                return 0;
        }
    if(!userExists(acTempuser))
    {
            system("cls");
            printf("\nIhr gew\204hlter Benutzername lautet: %s und ist verf\201gbar!\n Diesen Benutzernamen \201bernehmen?(y/n)", acTempuser);
            while(input != 121 && input != 89 && input != 110 && input != 78){
                    input = getch();
                    if(input == 121 || input == 89)
                    {
                            setPassword(acTemppass, 21);
                    } else if(input == 110 || input == 78){
                            return registrate();                    
                    }
            }

    }
        else
        {
            printf("\nDer gew\204hlte Benutzername ist leider schon vergeben !");
            system("pause");
            chooseUsername(acTempuser, 21, 0);
    }
            system("cls");
            almostSecureAlg(acTemppass, 21);//passwort wird verschl\201sselt
            regist(acTempuser, acTemppass);
            printf("Benutzer wurde erfolgreich registriert !\n");
            system("pause");
    return 1;
}

int login(int position)
/* Bietet die m\224glichkeit sich mit Benutzernamen und Passwort einzuloggen und leitet ins Hauptmen\201/Spiel weiter.
1. Parameter : int gibt an ob der Login ins Hauptmenue(0) oder in ein Spiel(1) weiterleitet.
4. R\201ckgabewert: int true/false (erfolgt/nicht erfolgt)
*/
{
    char acTempuser[21];
    char acTemppass[21];
    int iMatch = 0;

    while(iMatch == 0)
        {
            if(iMatch == 2)
            {
                    return 0;
            }
            if(!chooseUsername(acTempuser, 21, 1))
                        {
                                return 0;
                        }
                        if(position == 1 && strcmp(acTempuser,acBenutzernameEins) == 0){
                                system("cls");
                                printf("\nDieser Benutzer ist bereits eingelogt und kann nicht gegen sich selbst Spielen.\n");
                                system("pause");
                                return 0;
                        }
            choosePassword(acTemppass, 21, 2);
                
            almostSecureAlg(acTemppass, 21);
            iMatch = checkLogin(acTempuser, acTemppass);
                        if(!iMatch)
                        {
                                system("cls");
                                printf("\nBenutzername und Passwort stimmen nicht \201berein!\n");
                                system("pause");
                        }
    }
        switch(position)
        {
                case 0:
                        strncpy(acBenutzernameEins, acTempuser, 21);
                        break;
                case 1:
                        strncpy(acBenutzernameZwei, acTempuser, 21);
                        break;                  
        }
        return 1;
}

void almostSecureAlg(char* inpt, unsigned int strSize)
/* Einfacher algorithmus um ein Passwort zu verschl\201sseln.
1. Parameter : Zeiger auf Variable in der das Passwort gespeichert werden soll.
2. Parameter : L\204nge des Strings.
3. R\201ckgabewert: int true/false (erfolgt/nicht erfolgt)
*/
{
    int i = 0;
    int iSum = 0;
    char cSum[255];
    int iTemp;
    while(inpt[i] != 0)
    {
            iTemp = inpt[i];
            iSum = iSum + (iTemp*7564/(i+1));
            iSum = iSum + ((iTemp)*82175);
            i++;
    }

    sprintf(cSum,"%x",iSum);
        
    strncpy(inpt, cSum, strSize);
}

